iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

Django admin 是 Django 框架內建的一個功能,用於建立一個強大的、可自訂的管理後台界面,使開發者和管理者能夠輕鬆管理和維護網站的數據。Django admin 主要有以下功能和用途:

  1. 數據管理: 直接在這邊使用 CRUD 功能,快速新增物件
  2. 權限設定: 提供精細的網站權限設定,可以設定哪些用戶組可以訪問哪些特定的網頁
  3. 圖形化介面: 可以直接在瀏覽器輸入連結,進入該網站進行設定

註冊 models

剛剛我們已經把 model 建立完成了,我們要把這些 model 匯進 admin 後台中:

# store/online/admin.py

from django.contrib import admin
from .models import Employer, Store, Product
# Register your models here.

admin.site.register(Employer)
admin.site.register(Store)
admin.site.register(Product)

上面的意思就是我要讓 admin 的後台可以直接對這三個物件,進行 CRUD 操作

建立超級用戶

輸入下方指令後,會跑一段設定帳號密碼的流程,跑完再重新啟動 server,就可以進入瀏覽器的後台:

$ python3 manage.py createsuperuser

------
Username (leave blank to use 'yee0526'): 
Email address: 
Password: 
Password (again): 
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

系統會叫你設定自己的帳號密碼,輸入完成後就可以了

進入後台系統

接著點開瀏覽器,輸入 http://127.0.0.1:8000/admin/,可以看到以下畫面:

https://ithelp.ithome.com.tw/upload/images/20231005/20162365gm42RvZAYz.png

輸入完帳號密碼,就可以進到後台介面

使用後台系統新增物件

再來就可以很方便的點擊 ADD 的按鈕,快速新增各個物件,像下圖

https://ithelp.ithome.com.tw/upload/images/20231005/20162365NXvAUsKYkV.png

https://ithelp.ithome.com.tw/upload/images/20231005/20162365jEAdrj8Ut5.png

首先新增 Employer,新增好後可以到類似 list 的頁面看到目前所有的 老闆,像下圖:
https://ithelp.ithome.com.tw/upload/images/20231005/20162365ZctQygD1Kh.png

再來我們分別新增 StoreProduct:

https://ithelp.ithome.com.tw/upload/images/20231005/20162365oavjSoSRzo.png

https://ithelp.ithome.com.tw/upload/images/20231005/20162365WgWZAc9OGn.png

進階 admin 設定

剛剛只是新增一些物件而已,現在我們來稍微讓介面更豐富一點,剛剛新增好物件,有沒有發現物件的欄位都不見了,只有顯示我們在設定 models 的 __str__ 屬性,現在我們把欄位都顯示出來:

list_display

# online/admin.py

# 改成下面這幾行
class EmployerAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'age')

@admin.register(Store)
class StoreAdmin(admin.ModelAdmin):
    pass

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    pass

admin.site.register(Employer, EmployerAdmin)

Ps. @admin.register(Product) === admin.site.register(Product, ProductAdmin)

介紹一下上面那段在幹嘛:

  1. 首先讓取代掉原本的寫法,讓我們可以客製化後台系統
  2. 讓 Employer 物件可以顯示 list_display 輸入的幾項欄位
  3. @admin.register(Product) === admin.site.register(Product, ProductAdmin) 這兩個方法是通用的,主要就是讓類別可以被啟用

這樣修改好後,我們再來看下圖,可以發現我們 Employer 的欄位跑出來了!
https://ithelp.ithome.com.tw/upload/images/20231005/201623656EgvkSDfoS.png

接著把其他兩個物件的欄位也加上去:

  1. 先修改 admin.py 檔案
# online/admin.py

from django.contrib import admin
from .models import Employer, Store, Product

class EmployerAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'age')

@admin.register(Store)
class StoreAdmin(admin.ModelAdmin):
    list_display = ('title', 'description', 'employer')

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('title', 'price', 'display_store')

admin.site.register(Employer, EmployerAdmin)
  1. 再修改 models.py 檔案
# online/models.py

class Product(models.Model):
    title = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    store = models.ManyToManyField(Store)

    def display_store(self):        
        return ', '.join(store.title for store in self.store.all()[:3])    
    # ...省略

怎麼突然變這麼複雜的感覺?別擔心,慢慢跟你說這邊在幹嘛:

  1. 我們先在 StoreAdmin 的地方加上 employer 這樣就可以在頁面上顯示這間商店的老闆是誰

  2. 接著我也想在 ProductAdmin 的地方加上 Store,希望這樣加上去可以顯示這些產品都在哪些商店販賣,但!這樣寫的話會噴錯

  3. 因為多對多的關係,我們不能直接在欄位那邊這樣寫,因為這個欄位只能是一個字串,因此我們寫一個方法,讓那一個陣列,變成一個字串,這樣才可以成功顯示

  4. models 中的 Product 新增一個方法,這個方法應該不用再解釋一次,簡單說就是先把關聯全部找出來,再用迴圈把陣列變成字串

這兩邊都修改完後,就可以到後台看看現在長什麼樣子 :

  1. 首先是 Store,有看到這家商店的老闆是誰
    https://ithelp.ithome.com.tw/upload/images/20231005/20162365PtlUZ0WTbj.png

  2. 再來是 Product,最後面的欄位是 display_store,上面的確是顯示所有的商店,並且是一個字串:
    https://ithelp.ithome.com.tw/upload/images/20231005/20162365Ws9Ad4GXYX.png

總結

今天學到哪些東西呢?

  1. Django admin 介紹
  2. Django admin 的用法
  3. list_display 用途

最後附上 Github: https://github.com/eagle0526/Django-store


上一篇
DAY23 - Django console 介紹
下一篇
DAY25 - Django admin 介紹 - 2
系列文
Django 初學入門 - 從 ROR 的角度來學習 Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言